import { utilSplitCSV } from "./util";
import { testLat, testLon } from './test';

//经纬度坐标转换
export function coordDetail(lng, lat) {
    var Rc = 6378137;  // 赤道半径【单位：千米】
    var Rj = 6356725; //极半径【单位：千米】（地心到南北极的举例）
    var LoDeg = lng; // 经度【单位：度】
    var LoMin = (lng - LoDeg) * 60; // 经度【单位：分】
    var LoSec = (lng - LoDeg - LoMin / 60.) * 3600;// 经度【单位：秒】

    var LaDeg = lat; // 纬度【单位：度】
    var LaMin = (lat - LaDeg) * 60;// 纬度【单位：分】
    var LaSec = (lat - LaDeg - LaMin / 60.) * 3600;// 纬度【单位：秒】

    var Longitude = lng; // 经度【单位：度】
    var Latitude = lat; // 纬度【单位：度】
    var RadLo = lng * Math.PI / 180.;// 经度【单位：弧度】
    var RadLa = lat * Math.PI / 180.;// 纬度【单位：弧度】
    var Ec = Rj + (Rc - Rj) * (90. - Latitude) / 90.; // 不同纬度修正下的地球半径长度
    var Ed = Ec * Math.cos(RadLa); // 当前纬度下的纬度圈半径
    var result = { "RadLo": RadLo, "RadLa": RadLa, "Ec": Ec, "Ed": Ed, "Longitude": Longitude, "Latitude": Latitude };
    return result;
}

/*
 求B点经纬度
 @param A 已知点的经纬度，
 @param distance   AB两地的距离  单位km
 @param angle  AB连线与正北方向的夹角（0~360）
 @return  B点的经纬度
 */
export function coordVerticalPoint(lng, lat, distance, angle) {
    var P = coordDetail(lng, lat);
    var dx = distance * 1000 * Math.sin(angle / 180.0 * Math.PI);
    var dy = distance * 1000 * Math.cos(angle / 180.0 * Math.PI);
    var bjd = (dx / P.Ed + P.RadLo) * 180. / Math.PI;
    var bwd = (dy / P.Ec + P.RadLa) * 180. / Math.PI;
    return coordDetail(bjd, bwd);
}

/* 
    根据字符串切割为坐标组
    @param str 字符串
    @param isWKT 是否wkt
*/
export function coordListByStr(str, isWKT) {
    const exp = isWKT ? /\s/g : /\n|\r|;/g;
    const keyWord = 'WBIOKR';
    const arr = str
        .replace(exp, keyWord)
        .split(keyWord)
        .filter(Boolean)
        .map(s=>{
            let [lon, lat] = utilSplitCSV(s)
                .filter(Boolean)
                .slice(0,2)
                .map(a=>a&&a.trim())
                .map(Number);
            if (testLon(lon) && testLat(lat)) {
                return [lon, lat]
            } else {
                lon /= 3600;
                lat /= 3600;
                if (testLon(lon) && testLat(lat)) {
                    return [lon, lat]
                }
            }
            return false
        })
        .filter(Boolean);
    return arr;
}
